Skip to content

feat: 내 템플릿 목록 API (#66) - #68

Merged
oTAETAEo merged 6 commits into
developfrom
feat/66-template-list
Nov 9, 2026
Merged

oTAETAEo merged 6 commits into
developfrom
feat/66-template-list

Conversation

@oTAETAEo

@oTAETAEo oTAETAEo commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

관련 이슈

작업 내용

명세 8번 GET /api/v1/templates를 구현했습니다. 인증된 본인의 휴지통 제외 템플릿 전체를 생성 순(템플릿 ID 오름차순)으로 내려주고, 페이지는 나누지 않습니다.

커밋별로 보기

  1. 레포지토리: findAllByUserIdAndDeletedAtIsNullOrderByIdAsc (메서드 추가만)
  2. 서비스: TemplateQueryService.getTemplates(Long userId), TemplateListResult, TemplateListItemResult
  3. API: GET /api/v1/templates, TemplateListResponse, TemplateListItemResponse, TEMPLATE200_1
  4. 컨트롤러의 서비스 호출을 결과 변수로 분리 (다른 메서드와 같은 모양)
  5. develop 병합(feat: 휴지통 템플릿 복구 API (#67) #69 휴지통 복구), 복구 테스트를 실제 복구 API로 교체
  • variables는 복호화한 본문에서 TemplateVariableExtractor.extract로 뽑습니다.
  • totalCount는 명세 타입(Integer)에 맞춰 int이고, 목록 길이로 채웁니다. 개수 쿼리를 따로 두지 않았습니다.
  • v0.7의 sort 파라미터와 TEMPLATE400_8은 v0.8에서 삭제되어 만들지 않았습니다.

명세와 달라진 점

없음

테스트

  • TemplateListControllerTest (테스트컨테이너 MySQL)
    • 필드 순서, +09:00, no-store
    • ID 오름차순, 새 템플릿은 맨 뒤
    • 수정·사용 후에도 순서 그대로: 가운데를 고치고 셋째를 사용 기록해 최근 수정순·오래된 수정순·최근 사용순이면 순서가 달라지게 했습니다
    • 휴지통에서 되돌린 템플릿은 원래 자리로: 실제 복구 API(POST /api/v1/trash/templates/{id}/restore)를 부른 뒤 목록을 확인합니다
    • 휴지통·다른 회원 템플릿 제외, 0개면 totalCount: 0·빈 배열
    • 본문 복호화, 변수 목록 첫 등장 순·중복 제거, 사용 이력 없으면 lastUsedAt null
    • 토큰 없음 COMMON401_1
  • TemplateListRepositoryTest: 범위(휴지통·다른 회원 제외)와 ID 오름차순, 빈 목록
  • TemplateQueryServiceTest (모키토): 레포지토리 순서 유지, 개수, 변수 목록, 빈 목록
  • 전체 963개 통과 (feat: 휴지통 템플릿 복구 API (#67) #69 병합 후)

확인 체크리스트

  • ./gradlew build 통과
  • 테스트 포함
  • 변경 400줄 안팎 → 약 500줄 (본 코드 약 120줄, 테스트 약 380줄)
  • 병합된 마이그레이션 수정 안 함
  • 비밀 값·개인정보 없음
  • global 공통 코드 변경 없음

리뷰어에게

  1. 정렬은 인덱스로 처리됩니다: MySQL 8.4에서 EXPLAIN으로 확인했습니다 (20명·600행, ANALYZE 후). WHERE user_id = ? AND deleted_at IS NULL ORDER BY id ASC는 type=ref, key=idx_templates_user_deleted, ref=const,const, Extra Using index condition이고 Using filesort가 없습니다. ERD 메모대로 인덱스 끝의 기본 키 순서를 그대로 씁니다. 인덱스·마이그레이션은 추가하지 않았고, 확인용 임시 테스트는 지웠습니다
  2. 응답 객체를 공용화하지 않았습니다: 9·11번 응답과 필드가 같지만, 화면마다 각자 둔다는 기존 방침을 따랐습니다

🤖 Generated with Claude Code

@oTAETAEo oTAETAEo added feature 기능 개발 template 내 템플릿·휴지통 labels Nov 5, 2026
@oTAETAEo oTAETAEo self-assigned this Nov 5, 2026
@oTAETAEo oTAETAEo changed the title [feat] 내 템플릿 목록 API feat: 내 템플릿 목록 API (#66) Nov 5, 2026
@oTAETAEo
oTAETAEo marked this pull request as ready for review November 7, 2026 04:36

@chjpooh2002 chjpooh2002 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사소한 리뷰 하나 남겼으니 확인 부탁드립니다!


/** 내 템플릿 목록. 휴지통을 제외한 전체를 생성 순으로 */
public TemplateListResult getTemplates(Long userId) {
List<TemplateListItemResult> templates = templateRepository.findAllByUserIdAndDeletedAtIsNullOrderByIdAsc(userId)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

본문 복호화는 엔티티를 읽을 때 변환기에서 일어나서, 복호화에 실패하는 행이 하나라도 있으면 목록 전체가 500이 될 것 같아요. 그러면 사용자는 대시보드를 아예 못 보고, 그 템플릿을 휴지통으로 보낼 수도 없게 돼요. 이 PR에서 고칠 필요는 없지만, 깨진 행을 어떻게 다룰지(건너뛰고 로그를 남길지, 지금처럼 500으로 둘지) 이슈로 남겨두면 좋을 거 같습니다!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋습니다! 복호화 실패는 키가 다르거나 저장값이 변조된 경우에만 나고, 키 문제라면 행 하나가 아니라 전체가 깨져서 건너뛰어도 의미가 없을 것 같아요. 지금은 500으로 두고, 나중에 키 교체를 도입하면 그때 같이 다루겠습니다 !

@oTAETAEo
oTAETAEo merged commit 2c30015 into develop Nov 9, 2026
1 check passed
@oTAETAEo
oTAETAEo deleted the feat/66-template-list branch November 9, 2026 02:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature 기능 개발 template 내 템플릿·휴지통

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] 내 템플릿 목록 API

2 participants